home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / flc2.arc / VIEW.C < prev    next >
C/C++ Source or Header  |  1990-12-07  |  7KB  |  343 lines

  1. /*
  2.  
  3.     view.c
  4.     12-7-90
  5.  
  6.     Copyright 1989
  7.     John W. Small
  8.     All rights reserved
  9.  
  10.     PSW / Power SoftWare
  11.     P.O. Box 10072
  12.     McLean, Virginia 22102 8072
  13.  
  14.  
  15.     This program is a demo for flexlist.  It was written
  16.     for the Turbo C compiler running under MS DOS.
  17.  
  18. */
  19.  
  20. #include <stdlib.h>    /*  exit(), atol()  */
  21. #include <stdio.h>    /*  fopen(), fclose(),  */
  22.             /*  fgets()  */
  23. #include <string.h>    /*  strlen(), strcpy()  */
  24. #include <io.h>        /*  open(), close(), read()  */
  25. #include <fcntl.h>    /*  O_RDONLY, O_BINARY  */
  26. #include <conio.h>    /*  clrscr(), clreol(),  */
  27.             /*  gotoxy(), cprintf(),  */
  28.             /*  putch(), cgets(),  */
  29.             /*  textcolor(),  */
  30.             /*  textbackgound(),  */
  31.             /*  window()  */
  32. #include <dos.h>    /*  int86(), union REGS;  */
  33. #include <flexlist.h>    /*  FLfixedNew(), FLdelete(),  */
  34.             /*  FLnodes(), FLinsQD(),   */
  35.             /*  FLnextD(), FLprevD(),  */
  36.             /*  FLrecallD(), FLData(),  */
  37.             /*  FLcurNum()  */
  38.  
  39.  
  40. #define tabstops 8
  41. #define tabdisp ' '
  42. #define HSCROLL  8
  43. #define HPAN     50
  44. #define VSCROLL  7
  45. #define MAXLINES 23
  46. #define MAXCOLS 79
  47. #define FNSIZE  65
  48. #define BUFSIZE 2048
  49. static char buf[BUFSIZE];
  50. static int color, bgrd, ccolor, cbgrd, mcolor, mbgrd;
  51. static long lineno;
  52.  
  53. FlexL loadpgs(char *fname)    /*  return list of pages  */
  54. {
  55.     FlexL pgs;        /*  pages FlexL  */
  56.     long fpos, bpos, y;    /*  file and base positions */
  57.     int fd, eob;        /*  end of buf  */
  58.     register int i;
  59.  
  60.     if (!fname)
  61.         return FlexL0;
  62.     if (strlen(fname) >= FNSIZE)
  63.         return FlexL0;
  64.     if ((fd = open(fname,O_RDONLY|O_BINARY)) < 0)
  65.         return FlexL0;
  66.     if ((pgs = FLfixedNew(sizeof(long),FNSIZE,FLDdestruct0))
  67.         == FlexL0)
  68.         return FlexL0;
  69.     strcpy(FLData(pgs),fname);
  70.     fpos = bpos = 0;
  71.     if (!FLinsQD(pgs,&fpos))  {
  72.         FLdelete(&pgs);
  73.         close(fd);
  74.         return FlexL0;
  75.     }
  76.     for (y = 1; (eob = read(fd,buf,BUFSIZE)) != 0;
  77.         bpos += eob)
  78.         for (i = 0 ; i < eob; i++)
  79.             if (buf[i] == '\n')  {
  80.                 if (!(y % VSCROLL))  {
  81.                     fpos = bpos + i + 1;
  82.                     if (!FLinsQD(pgs,&fpos))  {
  83.                         FLdelete(&pgs);
  84.                         close(fd);
  85.                         return FlexL0;
  86.                     }
  87.                 }
  88.                 y++;
  89.             }
  90.     close(fd);
  91.     return pgs;
  92. }
  93.  
  94. #define  Home    71
  95. #define  UpArr  72
  96. #define  PgUp   73
  97. #define  LArr   75
  98. #define  RArr   77
  99. #define  EndKey 79
  100. #define  DnArr  80
  101. #define  PgDn   81
  102. #define  CtrlLArr    115
  103. #define  CtrlRArr    116
  104. #define  ESC    27
  105. #define     F1     59
  106. #define  F3     61
  107.  
  108. int getPC(void)
  109. {
  110.   union REGS rgs;
  111.  
  112.   rgs.x.ax  =  0x0000;
  113.   int86(0x16,&rgs,&rgs);
  114.   if (rgs.h.al) {
  115.      return (int ) rgs.h.al;
  116.   }
  117.   return - (int) rgs.h.ah;
  118. }
  119.  
  120. char *newFile(void)
  121. {
  122.     static char fname[FNSIZE];
  123.     int c;
  124.  
  125.     gotoxy(1,25);
  126.     textcolor(mcolor);
  127.     textbackground(mbgrd);
  128.     clreol();
  129.     fname[0] = FNSIZE;
  130.     cprintf("Enter file: ");
  131.     return cgets(fname);
  132. }
  133.  
  134. int putpgs(char *fname)
  135. {
  136.     FILE *pgsfile, *newpgsfile;
  137.     FlexL pgs, newpgs;
  138.     long fpos;
  139.     int c, x, y, i, startCol;
  140.  
  141.     if ((pgs = loadpgs(fname)) == FlexL0)
  142.         return 1;
  143.  
  144.     if ((pgsfile = fopen(FLData(pgs),"r"))
  145.         == (FILE *) 0)
  146.         return 2;
  147.  
  148.     for (c = lineno? 0 : -Home, startCol = 1; c != ESC;
  149.         c = getPC())  {
  150.         switch (c)  {
  151.         case 0:
  152.             if (!FLrecallD(pgs,&fpos,
  153.                 ((unsigned) ((lineno - 1) / VSCROLL)) + 1))
  154.                 FLrecallD(pgs,&fpos,1);
  155.             break;
  156.         case -PgDn:
  157.             if ((i = FLcurNum(pgs) + 3) < FLnodes(pgs))
  158.                 FLrecallD(pgs,&fpos,i);
  159.             else if (FLcurNum(pgs) < FLnodes(pgs))
  160.                 FLrecallD(pgs,&fpos,FLnodes(pgs));
  161.             else
  162.                 continue;
  163.             break;
  164.         case -PgUp:
  165.             if ((i = FLcurNum(pgs) - 3) > 0)
  166.                 FLrecallD(pgs,&fpos,i);
  167.             else if (i > -2)
  168.                 FLrecallD(pgs,&fpos,1);
  169.             else
  170.                 continue;
  171.             break;
  172.         case -Home:
  173.             FLrecallD(pgs,&fpos,1);
  174.             break;
  175.         case -EndKey:
  176.             FLrecallD(pgs,&fpos,FLnodes(pgs));
  177.             break;
  178.         case -UpArr:
  179.             if (FLcurNum(pgs) > 1)
  180.                 FLprevD(pgs,&fpos);
  181.             else
  182.                 continue;
  183.             break;
  184.         case -DnArr:
  185.             if (FLcurNum(pgs) < FLnodes(pgs))
  186.                 FLnextD(pgs,&fpos);
  187.             else
  188.                 continue;
  189.             break;
  190.         case -LArr:
  191.             if (startCol == 1)
  192.                 continue;
  193.             if ((startCol -= HSCROLL) < 1)
  194.                 startCol = 1;
  195.             break;
  196.         case -CtrlLArr:
  197.             if (startCol == 1)
  198.                 continue;
  199.             if ((startCol -= HPAN) < 1)
  200.                 startCol = 1;
  201.             break;
  202.         case -RArr:
  203.             startCol += HSCROLL;
  204.             break;
  205.         case -CtrlRArr:
  206.             startCol += HPAN;
  207.             break;
  208.         case -F1:
  209.             textcolor(mcolor);
  210.             textbackground(mbgrd);
  211.             gotoxy(1,25);
  212.             clreol();
  213.             cprintf("Keys: PgUp, PgDn, Home = top,"
  214.             " End = bottom, F3 = new file, ESC = Quit");
  215.             continue;
  216.         case -F3:
  217.             if ((newpgs = loadpgs(newFile()))
  218.                 != (FlexL) 0)  {
  219.                 if ((newpgsfile =
  220.                     fopen(FLData(newpgs),"r"))
  221.                     != (FILE *) 0)  {
  222.                     fclose(pgsfile);
  223.                     pgsfile = newpgsfile;
  224.                     FLdelete(&pgs);
  225.                     pgs = newpgs;
  226.                     FLrecallD(pgs,&fpos,1);
  227.                 }
  228.                 else  {
  229.                     FLdelete(&newpgs);
  230.                     continue;
  231.                 }
  232.             }
  233.             else
  234.                 continue;
  235.             break;
  236.         default:
  237.             continue;
  238.         }
  239.         fseek(pgsfile,fpos,0);
  240.         textcolor(color);
  241.         textbackground(bgrd);
  242.         window(1,1,80,24);
  243.         clrscr();
  244.         for (y = 1; (y <= MAXLINES) &&
  245.             fgets(buf,BUFSIZE,pgsfile); y++)  {
  246.             gotoxy(1,y);
  247.             for (x = 1, i = 0;
  248.                 buf[i] && buf[i] != '\n' &&
  249.                 x < startCol + MAXCOLS;
  250.                 i++)  {
  251.                 if (buf[i] == '\t')  {     /* expand tab */
  252.                     for (;x % tabstops; x++)
  253.                         if (x >= startCol) putch(tabdisp);
  254.                     if (x >= startCol) putch(tabdisp);
  255.                     x++;
  256.                 }
  257.                 else if (x < startCol)
  258.                     x++;
  259.                 else if (buf[i] < 26)  {  /* ctrl char */
  260.                     textcolor(ccolor);
  261.                     textbackground(cbgrd);
  262.                     putch(buf[i] + 'A' - 1);
  263.                     textcolor(color);
  264.                     textbackground(bgrd);
  265.                     x++;
  266.                 }
  267.                 else {
  268.                     putch(buf[i]);
  269.                     x++;
  270.                 }
  271.             }
  272.         }
  273.         textcolor(mcolor);
  274.         textbackground(mbgrd);
  275.         window(1,1,80,25);
  276.         gotoxy(1,25);
  277.         cprintf("View file: %s   Line %d   Col %d",
  278.             (char *) FLData(pgs),
  279.             (FLcurNum(pgs) - 1) * VSCROLL + 1,
  280.             startCol);
  281.         clreol();
  282.     }
  283.     fclose(pgsfile);
  284.     FLdelete(&pgs);
  285.     return 0;
  286. }
  287.  
  288. int vmode(void)
  289. {
  290.     union REGS rgs;
  291.  
  292.     rgs.x.ax = 0x0F00;
  293.     int86(0x10,&rgs,&rgs);
  294.     return (int) rgs.h.al;
  295. }
  296.  
  297. void scrInit(void)
  298. {
  299.     textmode(C80);
  300.     if (vmode() == 7)  {
  301.     color  = BLACK;
  302.     bgrd   = LIGHTGRAY;
  303.     ccolor = LIGHTGRAY;
  304.     cbgrd  = BLACK;
  305.     mcolor = BLACK;
  306.         mbgrd  = LIGHTGRAY;
  307.     }
  308.     else  {
  309.     color  = BLACK;
  310.     bgrd   = LIGHTGRAY;
  311.     ccolor = BLUE;
  312.     cbgrd  = LIGHTGRAY;
  313.     mcolor = LIGHTGRAY;
  314.     mbgrd  = RED;
  315.     }
  316.     textcolor(color);
  317.     textbackground(bgrd);
  318.     clrscr();
  319. }
  320.  
  321. main(int argc, char *argv[])
  322. {
  323.     int i;
  324.  
  325.     if (argc > 3)  {
  326.         puts("\nusage:  list  filename  [lineno]");
  327.         exit(1);
  328.     }
  329.     if (argc == 3)
  330.         lineno = atol(argv[2]);
  331.     else
  332.         lineno = 0L;
  333.     scrInit();
  334.     if (argc >= 2)
  335.         i = putpgs(argv[1]);
  336.     else
  337.         i = putpgs(newFile());
  338.     textcolor(LIGHTGRAY);
  339.     textbackground(BLACK);
  340.     clrscr();
  341.     return i;
  342. }
  343.